/**
 * @brief 计算音频主频率并保存频谱数据
 * @param audio 输入的音频数据(已归一化)
 * @param sample_rate 采样率
 * @param spectrum_file 频谱保存路径(默认"spectrum.csv")
 * @return double 主频率(Hz)
 */
double analyze_frequency(const std::vector<double>& audio,
                         uint32_t sample_rate,
                         const char* spectrum_file = "spectrum.csv") {
    const size_t N = audio.size();  // 采样点数

    // 分配FFTW内存
    fftw_complex* fft_out = fftw_alloc_complex(N/2 + 1); // 复数输出缓冲区
    double* in = fftw_alloc_real(N);                     // 实数输入缓冲区
    std::copy(audio.begin(), audio.end(), in);           // 复制音频数据

    // 创建实数到复数FFT计划
    fftw_plan plan = fftw_plan_dft_r2c_1d(N, in, fft_out, FFTW_ESTIMATE);
    fftw_execute(plan);  // 执行FFT变换

    // 计算幅度谱并寻找主频
    std::vector<double> spectrum(N/2);  // 频谱数据(忽略镜像部分)
    double max_amp = 0;                 // 最大幅度值
    size_t max_index = 0;                // 最大幅度对应的频点索引

    // 遍历频点（从1开始，跳过直流分量）
    for (size_t i = 1; i < N/2; ++i) {
        const double re = fft_out[i][0];  // 实部
        const double im = fft_out[i][1];  // 虚部
        spectrum[i] = sqrt(re*re + im*im); // 计算幅度

        // 更新最大幅度信息
        if (spectrum[i] > max_amp) {
            max_amp = spectrum[i];
            max_index = i;
        }
    }

    // 保存频谱数据到CSV文件
    std::ofstream out(spectrum_file);
    out << "Frequency,Amplitude\n";  // 列标题
    for (size_t i = 0; i < N/2; ++i) {
        // 频率 = 频点索引 * 采样率 / 总点数
        out << (i * sample_rate / double(N)) << ","
            << spectrum[i] << "\n";
    }

    // 释放FFTW资源
    fftw_destroy_plan(plan);
    fftw_free(in);
    fftw_free(fft_out);

    // 计算主频率：最大幅度对应的频率
    return max_index * sample_rate / double(N);
}
